访问电脑版页面

导航:老古开发网手机版51单片机与USB

基于51单片机372的USB通信代码

导读:#include #include "INTRINS.h"#define OP_CMD1// 命令操作码#define OP_DATA0// 数据操作码#define DELAY_TIMES8// 延时2微秒#define DELAY_CNT_NUMS2*DELAY_TIMES// 延时2微秒所需的时钟周期数(对于22.1184MHz晶振
关键字:
51单片机,usb通信,

#include
#include "INTRINS.h"



#define OP_CMD1// 命令操作码
#define OP_DATA0// 数据操作码
#define DELAY_TIMES8// 延时2微秒
#define DELAY_CNT_NUMS2*DELAY_TIMES// 延时2微秒所需的时钟周期数(对于22.1184MHz晶振,每个微秒包含22.1184个时钟周期)
//#define MY_USB_VENDOR_ID0x4348// USB设备制造商标识
//#define MY_USB_PRODUCT_ID0x5537// USB设备产品标识


//sbitUSB_CS=P1^3;//cs接地内部晶振24.5M 倍频49M
sbitUSB_INT=P0^0;
sbitUSB_A0=P1^4;
sbitUSB_WR=P1^6;
sbitUSB_RD=P1^5;
//sfrUSB_DATA=0x84;
#define get_usb P2
#define set_usb(dat1) P2=dat1

//#define set_usb(dat1) P2|=(dat1>>1);P17=((dat1 & 0x01)==1)
#define delay_ns _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()

constUINT8CMyDevDescr[] = { 0x12, 0x01, 0x10, 0x01,
0xFF, 0x80, 0x37, 0x08,
0x48, 0x43, 0x37, 0x55,// 厂商ID和产品ID
0x00, 0x01, 0x01, 0x02,
0x00, 0x01 };
// 配置描述符
constUINT8CMyCfgDescr[] = { 0x09, 0x02, 0x27, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32,
0x09, 0x04, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x37, 0x00,
0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00,
0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00,
0x07, 0x05, 0x81, 0x03, 0x08, 0x00, 0x00 };
// 语言描述符
constUINT8CMyLangDescr[] = { 0x04, 0x03, 0x09, 0x04 };
// 厂家信息
constUINT8CMyManuInfo[] = { 0x0E, 0x03, 'w', 0, 'c', 0, 'h', 0, '.', 0, 'c', 0, 'n', 0 };
// 产品信息
constUINT8CMyProdInfo[] = { 0x0C, 0x03, 'C', 0, 'H', 0, '3', 0, '7', 0, '4', 0 };
UINT8UsbConfig = 0;


void Delay2us( )
{
INT8U i;

i = (INT8U)DELAY_CNT_NUMS;
while (--i);
}


voidmDelaymS( INT8U ms )
{
INT8U j;
while ( ms -- ) {
j=250;
do
{
Delay2us();
Delay2us();
//Delay2us();
//Delay2us();
}
while ( j -- );

}
}



void CH375_WR_CMD_PORT(INT8U dat)
{



USB_WR = 1;
USB_RD = 1;

set_usb(dat);
delay_ns;
USB_A0 = OP_CMD;
// 准备写命令
_nop_();

//USB_CS = 0;
USB_WR = 0;
USB_WR = 0;
USB_WR = 0;
USB_WR = 0;

USB_WR = 1;
//USB_CS = 1;// 结束写命令(USB_WR信号的有效时间不能超过10us)
USB_A0 = 0;
P2=0xff;
//P2|=0x7f;
//P1|=0x80;

}


void CH375_WR_DAT_PORT(INT8U dat)
{


USB_WR = 1;
USB_RD = 1;

set_usb(dat);
delay_ns;
USB_A0 = OP_DATA;// 准备写数据
_nop_();

//USB_CS = 0;
USB_WR = 0;
USB_WR = 0;// 开始写数据
USB_WR = 0;
USB_WR = 0;

USB_WR = 1;// 结束写命令(USB_WR信号的有效时间不能超过10us)
//USB_CS = 1;
USB_A0 = 0;
P2=0xff;
//P2|=0x7f;
//P1|=0x80;
}

INT8U CH375_RD_DAT_PORT(void)
{
INT8U nData;

USB_WR= 1;
USB_RD= 1;

delay_ns;
//delay_ns;// 将USB_DATA(P4口)配置为数字输入
USB_A0 = OP_DATA;
//USB_CS = 0;// 准备读数据
_nop_();

USB_RD = 0;
USB_RD = 0;
USB_RD = 0;

nData = get_usb;

USB_RD = 1;// 结束读命令(USB_RD信号的有效时间不能超过10us)
//USB_CS = 1;
USB_A0 = 0;
return nData;// 返回读取的数据
}

INT8URead374Byte(INT8U mAddr )
{
CH375_WR_CMD_PORT( mAddr );
return( CH375_RD_DAT_PORT());
}

voidWrite374Byte( INT8U mAddr, INT8U mData )
{
CH375_WR_CMD_PORT( mAddr );
CH375_WR_DAT_PORT( mData );
}

voidRead374Block( INT8U mAddr, INT8U mLen, INT8U * mBuf )
{
CH375_WR_CMD_PORT( mAddr );
while ( mLen -- ) *mBuf++ = CH375_RD_DAT_PORT( );
}

voidWrite374Block( INT8U mAddr, INT8U mLen, INT8U * mBuf )
{
INT8U dat,k;
k=0;
CH375_WR_CMD_PORT( mAddr );
while ( mLen -- )
{
dat=*mBuf++;
//dat= up[k++];
CH375_WR_DAT_PORT(dat);
}
}

来源:互联网   作者:karen  2018/8/24 12:00:02
栏目: [ 51单片机与USB]

相关阅读

基于USB总线和89C51单片机的数据采集系统设计

USB接口芯片SL811HS在51单片机系统中的应用

基于51单片机372的USB通信代码

基于USB总线和89C51单片机的数据采集系统设计

51单片机控制SL811HS的USB主机底层驱动